package ar.com.larreta.colegio.client.planesdepagos;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import ar.com.larreta.colegio.intercambio.client.BajasDePlanDePagos;
import ar.com.larreta.colegio.intercambio.client.Item;
import ar.com.larreta.colegio.intercambio.client.ListaDePlanesDePagos;
import ar.com.larreta.colegio.intercambio.client.Obligacion;
import ar.com.larreta.colegio.intercambio.client.PlanDePago;
import ar.com.larreta.colegio.intercambio.client.PlanDePagoActualizado;
import ar.com.larreta.controlador.client.Invocador;
import ar.com.larreta.grilla.client.Grilla;
import ar.com.larreta.grilla.client.ventanas.BotonBorrarConPedidoPresionado;
import ar.com.larreta.grilla.client.ventanas.RetornoDeLlamadaEnVentanaConGrilla;
import ar.com.larreta.grilla.client.ventanas.VentanaConGrilla;
import ar.com.larreta.vista.client.BarraHerramientas;
import ar.com.larreta.vista.client.CajaDeTexto;
import ar.com.larreta.vista.client.CamposConst;
import ar.com.larreta.vista.client.Estado;
import ar.com.larreta.vista.client.Mensajes;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
import com.extjs.gxt.ui.client.widget.VerticalPanel;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;

public class VentanaPlanesDePagos extends VentanaConGrilla {

	public static final Integer ANCHO_VENTANA = 1150;
	public static final Integer ANCHO_IZQUIERDA = 350;
	public static final Integer ANCHO_CENTRO = 400;
	public static final Integer ANCHO_DERECHA = 350;
	public static final Integer LARGO_VENTANA = 481;

	public static final Integer LARGO_DATOS = 100;
	public static final Integer LARGO_INFO = 400;

	public static final Integer ANCHO_GRILLA = 310;
	public static final Integer LARGO_GRILLA = 350;
	public static final Integer TAMANIO_TEXTO_MENSAJE = 200;

	private static final String LISTA = "listaPlanesDePagos";

	// Informacion del Responsable
	private CajaDeTexto nombre;
	
	private SectorObligaciones sectorObligaciones;
	private SectorDetalles sectorDetalles;
	private SectorDetallesEspecificos sectorDetallesEspecificos;

	public SectorObligaciones getSectorObligaciones() {
		return sectorObligaciones;
	}

	public SectorDetalles getSectorDetalles() {
		return sectorDetalles;
	}

	public SectorDetallesEspecificos getSectorDetallesEspecificos() {
		return sectorDetallesEspecificos;
	}

	public VentanaPlanesDePagos() {

		super(Mensajes.getInstancia().get("msg.colegio.planesdepagos.titulo"),	null);

		this.setSize(ANCHO_VENTANA, LARGO_VENTANA);

		VerticalPanel barraYCampos = new VerticalPanel();
		add(barraYCampos);
		barraYCampos.setSize(ANCHO_VENTANA, LARGO_DATOS + 30);

		barraHerramientas = new BarraHerramientas(this, ANCHO_VENTANA, 25);
		barraYCampos.add(barraHerramientas);

		HorizontalPanel panelCamposEntrada = new HorizontalPanel();
		panelCamposEntrada.setSize(ANCHO_VENTANA, LARGO_DATOS);
		panelCamposEntrada.setHorizontalAlign(HorizontalAlignment.LEFT);
		barraYCampos.add(panelCamposEntrada);

		VerticalPanel izquierda = new VerticalPanel();
		VerticalPanel centro = new VerticalPanel();
		VerticalPanel derecha = new VerticalPanel();
		panelCamposEntrada.add(izquierda);
		panelCamposEntrada.add(centro);
		panelCamposEntrada.add(derecha);

		izquierda.setSize(ANCHO_IZQUIERDA, LARGO_DATOS);
		centro.setSize(ANCHO_CENTRO, LARGO_DATOS);
		derecha.setSize(ANCHO_DERECHA, LARGO_DATOS);

		FieldSet fieldSet = new FieldSet();
		fieldSet.setHeading(Mensajes.getInstancia().get("msg.colegio.planesdepagos.detalle"));
		fieldSet.setSize((ANCHO_IZQUIERDA) - 15, LARGO_INFO);

		nombre = new CajaDeTexto(Mensajes.getInstancia().get("msg.colegio.nombre"), null);
		nombre.getCampoTexto().setWidth(TAMANIO_TEXTO_MENSAJE);
		nombre.getCampoTexto().setAllowBlank(Boolean.FALSE);
		registrarCampo(nombre.getCampoTexto());
		
		izquierda.add(nombre.getHorizontal());
		izquierda.add(fieldSet);

		sectorObligaciones = new SectorObligaciones(this);
		centro.add(sectorObligaciones);

		sectorDetalles = new SectorDetalles(this);
		derecha.add(sectorDetalles);
		
		sectorDetallesEspecificos = new SectorDetallesEspecificos(this);
		derecha.add(sectorDetallesEspecificos);
		
		grilla = new Grilla(new ListaDePlanesDePagos(), getConfiguracionColumnas(), LISTA);
		grilla.setSize(ANCHO_GRILLA, LARGO_GRILLA);
		grilla.setTamanioPagina(13);

		grilla.addSelectionChangeListener(new CambioEnLaSeleccionGrillaPlanesDePagos(this));
		grilla.habilitarMenuContextual(new BotonBorrarConPedidoPresionado(this, new BajasDePlanDePagos()));
		
		grilla.agregarFiltro(new StringFilter(CamposConst.NOMBRE));
		
		fieldSet.add(grilla);
		fieldSet.add(grilla.getToolBar());

		sectorDetalles.estadoBotonesSectorConGrilla(Boolean.FALSE);
		sectorDetallesEspecificos.estadoBotonesSectorConGrilla(Boolean.FALSE);
		
		show();
	}
	
	public void confirmando() {
		if (esValido()) {
			this.mask();
			PlanDePago plan = null;
			if (estado.equals(Estado.CREACION)) {
				plan = new PlanDePago();
			} else {
				plan = new PlanDePagoActualizado();
				plan.setId(((PlanDePago) getGrilla().getSelectionModel().getSelectedItems().get(0)).getId());
				
				Collection obligacionesBorradas = sectorObligaciones.getGrilla().getDatosBorrados();
				if (obligacionesBorradas!=null){
					List items = new ArrayList<Item>();
					Iterator<Obligacion> it = obligacionesBorradas.iterator();
					while (it.hasNext()) {
						Obligacion obligacion = (Obligacion) it.next();
						if (obligacion.getItem()!=null){
							items.add(obligacion.getItem());
						}
					}
					plan.agregarDatosBorrados(items);
				}
			}
			plan.setNombre((String) nombre.getCampoTexto().getValue());
			
			List obligaciones = sectorObligaciones.getGrilla().getDatos();
			if (obligaciones!=null){
				Iterator<Obligacion> it = obligaciones.iterator();
				while (it.hasNext()) {
					Obligacion obligacion = (Obligacion) it.next();
					obligacion.setId(null);
				}
			}
			
			plan.setObligaciones(sectorObligaciones.getGrilla().getDatos());

			Invocador.invocar(plan, new RetornoDeLlamadaEnVentanaConGrilla(this));
		}
	}

	private ColumnModel getConfiguracionColumnas() {
		ColumnConfig columnNombre = new ColumnConfig(CamposConst.NOMBRE, Mensajes.getInstancia().get("msg.colegio.nombre"), 307);

		ArrayList<ColumnConfig> columnConfigs = new ArrayList<ColumnConfig>();
		columnConfigs.add(columnNombre);

		return new ColumnModel(columnConfigs);
	}

	@Override
	public void limpiar() {
		super.limpiar();
		
		sectorObligaciones.getGrilla().limpiar();
		sectorObligaciones.getGrilla().load();
		sectorDetalles.getGrilla().limpiar();
		sectorDetalles.getGrilla().load();
		sectorDetallesEspecificos.getGrilla().limpiar();
		sectorDetallesEspecificos.getGrilla().load();
		
	}

	public Grilla getGrilla() {
		return grilla;
	}

	public CajaDeTexto getNombre() {
		return nombre;
	}


}
